package com.cy.pj.modules.controller;

import com.cy.pj.module.pojo.RequestParameter;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;

/**
 * 在此对象中演示请求中参数的处理过程
 *
 */
@RestController
public class ParamObjectController {
    //访问：http://localhost/doParam01?id=10
    @RequestMapping("/doParam01")
    public String doMethodParam(HttpServletRequest request){
        String idStr=request.getParameter("id");
        //加入我们后面业务需要的是一个整数，此时还需要进行类型转换
        Integer id = Integer.parseInt(idStr);
        //后续可以基于整数id值执行后面的业务了，例如删除，查找...
        return "request params id's value is "+id;
    }
    //访问：http://localhost/doParam02?id=20
    //当时用方法参数直接获取请求数据时，方法参数名要与请求参数名相同
    @RequestMapping("/doParam02")
    public String doMethodParam(Integer id){//框架的力量
        return "request params id's value is "+id;
    }
    //访问：http://localhost/doParam03?id=10,20,30,40
    @RequestMapping("/doParam03")
    public String doMethodParam(Integer[] id){//框架的力量
        return "request params id's value is "+ Arrays.toString(id);
    }
    //访问：http://localhost/doParam04?startTime=2020/12/30
    @RequestMapping("/doParam04")
    public String doMethodParam(Date startTime){//框架的力量
        return "request params id's value is "+ startTime;
    }
    //访问：http://localhost/doParam041?startTime=2020-12-30
    @RequestMapping("/doParam041")
    public String doMethodParam1(
            @DateTimeFormat(pattern = "yyyy-MM-dd") Date startTime){//框架的力量
        return "request params id's value is "+ startTime;
    }
    //访问：http://localhost/doParam05?name=tony&page=2
    //假如在方法中需要指定这个参数的必须在请求参数中有传递
    //@RequestParam注解用于描述方法参数，用于定义参数规则，
    //1)方法参数变量的值，来自哪个请求参数@RequestParam("name")
    //2)方法参数变量是否可以不传值(required = true)
    //
    @RequestMapping("/doParam05")
    public String doMethodParam(@RequestParam("name") String name,
                  @RequestParam(required = true)//true表示必须要赋值
                          Integer page){//框架的力量
        return "request params id's value is "+ name +":"+page;
    }
    //=======================POJO对象方式===========================================
    //访问：http://localhost/doParam06?name=tony
    //当使用pojo对象封装请求参数信息时，请求中的参数名应与方法参数pojo对象
    // 中的set相关方法相匹配
    @GetMapping("/doParam06")
    public String doMethodParam(RequestParameter param){//框架的力量
        return "request params id's value is RequestParameter"+param.toString();
    }
    //访问：http://localhost/doParam07?name=tony&ids=10,20,30,40
    //@GetMapping("/doParam07")
    //post请求可以借助postman工具进行访问
    @PostMapping("/doParam07")
    public String doMethodParam(RequestParameter param,Integer... ids){//框架的力量
        return "request params id's value is RequestParameter"+param.toString()+Arrays.toString(ids);
    }
    //===========================Map对象方式=====================================
    //http://localhost/doParam08?code=1&message=ok 假如以这种方式直接在浏览器地址栏访问会有405异常
    //post请求可以借助postman工具进行访问
    //使用map作为方法参数封装请求数据，默认是不可以,因为默认底层会认为用于封装响应
    //可以借助RequestParam对map进行描述
    @PostMapping("/doParam08")
    public String doMethodParam(@RequestParam Map<String,Object> map){//框架的力量
        return "request params id's value is RequestParameter"+map.toString();
    }

    /**
     * @RequestBody注解描述方法参数时，客户端
     * 可以以post方式提交json格式的数据
     * 说明：@REquestbody注解描述的方法不能封装数据
     * @param map
     * @return
     */
    @PostMapping("/doParam09")
    public String doMethodMapParam(@RequestBody Map<String,Object> map){//框架的力量
        return "request params id's value is RequestParameter"+map.toString();
    }

    @PostMapping("/doParam10")
    public String doMethodJsonParam(@RequestBody RequestParameter param){//框架的力量
        return "request params id's value is RequestParameter"+param.toString();
    }
    //====================rest 风格url参数获取===========================================
    //rest风格:软件架构编码风格(跨平台)
    //rest风格url的定义:/path/{var1}/{var2},这里的{}括起来的为变量
    //@Pathvariable注解描述方法参数变量时，表示这个参数的值来自url中{}表达式给定值
    //例如：
    @GetMapping("/doParam11/{id}/{name}")
    public String doMethodRestUrlParam(@PathVariable("id") Integer id,@PathVariable String name){
        return "request params id's value is "+id+",name:"+name;
    }
}